package com.xmindguoguo.boot.common.constant.factroy;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.xmindguoguo.boot.common.constant.GlobalConstant;
import com.xmindguoguo.boot.common.constant.cache.Cache;
import com.xmindguoguo.boot.common.constant.cache.CacheKey;
import com.xmindguoguo.boot.modular.system.model.TSystemDeptModel;
import com.xmindguoguo.boot.modular.system.model.TSystemMenuModel;
import com.xmindguoguo.boot.modular.system.model.TSystemRoleModel;
import com.xmindguoguo.boot.modular.system.model.TSystemUserModel;
import com.xmindguoguo.boot.modular.system.service.ITSystemDeptService;
import com.xmindguoguo.boot.modular.system.service.ITSystemMenuService;
import com.xmindguoguo.boot.modular.system.service.ITSystemRoleService;
import com.xmindguoguo.boot.modular.system.service.ITSystemUserService;
import com.xmindguoguo.boot.util.ToolUtil;
import com.xmindguoguo.boot.util.spring.SpringContextHolder;

/*
 * import cn.afterturn.gen.common.constant.state.ManagerStatus; import cn.afterturn.gen.common.constant.state.MenuStatus; import
 * cn.afterturn.gen.common.persistence.model.Dict; import cn.afterturn.gen.common.persistence.model.Notice; import
 * cn.afterturn.gen.core.support.StrKit; import cn.afterturn.gen.core.util.Convert;
 */

/**
 * 常量的生产工厂
 *
 * @author fengshuonan
 * @date 2017年2月13日 下午10:55:21
 */
@Component
@DependsOn("springContextHolder")
public class ConstantFactory implements IConstantFactory {

    /*   
    private DictMapper dictMapper = SpringContextHolder.getBean(DictMapper.class);
    
    private MenuMapper menuMapper = SpringContextHolder.getBean(MenuMapper.class);
    private NoticeMapper noticeMapper = SpringContextHolder.getBean(NoticeMapper.class);*/
    private ITSystemUserService systemUserService = SpringContextHolder.getBean(ITSystemUserService.class);
    private ITSystemRoleService systemRoleService = SpringContextHolder.getBean(ITSystemRoleService.class);
    private ITSystemDeptService systemDeptService = SpringContextHolder.getBean(ITSystemDeptService.class);
    private ITSystemMenuService systemMenuService = SpringContextHolder.getBean(ITSystemMenuService.class);

    public static IConstantFactory me() {
        return SpringContextHolder.getBean("constantFactory");
    }

    /**
     * 根据用户id获取用户名称
     *
     * @author stylefeng
     * @Date 2017/5/9 23:41
     */
    @Override
    @Cacheable(value = Cache.USER, key = "'" + CacheKey.USER_NAME + "'+#userId")
    public String getUserNameById(Long userId) {
        TSystemUserModel user = systemUserService.selectById(userId);
        if (user != null) {
            return user.getName();
        } else {
            return "--";
        }
    }

//    /**
//     * 根据用户id获取用户账号
//     *
//     * @author stylefeng
//     * @date 2017年5月16日21:55:371
//     */
//    @Override
//    public String getUserAccountById(Integer userId) {
//        User user = userMapper.selectById(userId);
//        if (user != null) {
//            return user.getAccount();
//        } else {
//            return "--";
//        }
//    }
//
//    /**
//     * 通过角色ids获取角色名称
//     */
//    @Override
//    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleIds")
//    public String getRoleName(String roleIds) {
//        Integer[] roles = Convert.toIntArray(roleIds);
//        StringBuilder sb = new StringBuilder();
//        for (int role : roles) {
//            Role roleObj = roleMapper.selectById(role);
//            if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
//                sb.append(roleObj.getName()).append(",");
//            }
//        }
//        return StrKit.removeSuffix(sb.toString(), ",");
//    }
//
    /**
     * 通过角色id获取角色名称
     */
    @Override
    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId")
    public String getSingleRoleName(Long roleId) {
        if (0 == roleId) {
            return "--";
        }
        TSystemRoleModel roleObj = systemRoleService.selectById(roleId);
        if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
            return roleObj.getName();
        }
        return "";
    }

    /**
     * 通过角色id获取角色英文名称
     */
    @Override
    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_TIP + "'+#roleId")
    public String getSingleRoleTip(Long roleId) {
        if (0 == roleId) {
            return "--";
        }
        TSystemRoleModel roleObj = systemRoleService.selectById(roleId);
        if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
            return roleObj.getTips();
        }
        return "";
    }

    /**
     * 获取部门名称
     */
    @Override
    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.DEPT_NAME + "'+#deptId")
    public String getDeptName(Long deptId) {
        TSystemDeptModel dept = systemDeptService.selectById(deptId);
        if (ToolUtil.isNotEmpty(dept) && ToolUtil.isNotEmpty(dept.getFullName())) {
            return dept.getFullName();
        }
        return "";
    }

//    /**
//     * 获取菜单的名称们(多个)
//     */
//    @Override
//    public String getMenuNames(String menuIds) {
//        Integer[] menus = Convert.toIntArray(menuIds);
//        StringBuilder sb = new StringBuilder();
//        for (int menu : menus) {
//            Menu menuObj = menuMapper.selectById(menu);
//            if (ToolUtil.isNotEmpty(menuObj) && ToolUtil.isNotEmpty(menuObj.getName())) {
//                sb.append(menuObj.getName()).append(",");
//            }
//        }
//        return StrKit.removeSuffix(sb.toString(), ",");
//    }
//
//    /**
//     * 获取菜单名称
//     */
//    @Override
//    public String getMenuName(Integer menuId) {
//        if (ToolUtil.isEmpty(menuId)) {
//            return "";
//        } else {
//            Menu menu = menuMapper.selectById(menuId);
//            if (menu == null) {
//                return "";
//            } else {
//                return menu.getName();
//            }
//        }
//    }
//
//    /**
//     * 获取菜单名称通过编号
//     */
//    @Override
//    public String getMenuNameByCode(String code) {
//        if (ToolUtil.isEmpty(code)) {
//            return "";
//        } else {
//            Menu param = new Menu();
//            param.setCode(code);
//            Menu menu = menuMapper.selectOne(param);
//            if (menu == null) {
//                return "";
//            } else {
//                return menu.getName();
//            }
//        }
//    }
//
//    /**
//     * 获取字典名称
//     */
//    @Override
//    public String getDictName(Integer dictId) {
//        if (ToolUtil.isEmpty(dictId)) {
//            return "";
//        } else {
//            Dict dict = dictMapper.selectById(dictId);
//            if (dict == null) {
//                return "";
//            } else {
//                return dict.getName();
//            }
//        }
//    }
//
//    /**
//     * 获取通知标题
//     */
//    @Override
//    public String getNoticeTitle(Integer dictId) {
//        if (ToolUtil.isEmpty(dictId)) {
//            return "";
//        } else {
//            Notice notice = noticeMapper.selectById(dictId);
//            if (notice == null) {
//                return "";
//            } else {
//                return notice.getTitle();
//            }
//        }
//    }
//
//    /**
//     * 根据字典名称和字典中的值获取对应的名称
//     */
//    @Override
//    public String getDictsByName(String name, Integer val) {
//        Dict temp = new Dict();
//        temp.setName(name);
//        Dict dict = dictMapper.selectOne(temp);
//        if (dict == null) {
//            return "";
//        } else {
//            Wrapper<Dict> wrapper = new EntityWrapper<Dict>();
//            wrapper = wrapper.eq("pid", dict.getId());
//            List<Dict> dicts = dictMapper.selectList(wrapper);
//            for (Dict item : dicts) {
//                if (item.getNum() != null && item.getNum().equals(val)) {
//                    return item.getName();
//                }
//            }
//            return "";
//        }
//    }
//
//    /**
//     * 获取性别名称
//     */
//    @Override
//    public String getSexName(Integer sex) {
//        return getDictsByName("性别", sex);
//    }
//
//    /**
//     * 获取用户登录状态
//     */
//    @Override
//    public String getStatusName(Integer status) {
//        return ManagerStatus.valueOf(status);
//    }

//    /**
//     * 获取菜单状态
//     */
//    @Override
//    public String getMenuStatusName(Integer status) {
//        return MenuStatus.valueOf(status);
//    }

    /**
     * 查询字典
     */
//    @Override
//    public List<Dict> findInDict(Integer id) {
//        if (ToolUtil.isEmpty(id)) {
//            return null;
//        } else {
//            EntityWrapper<Dict> wrapper = new EntityWrapper<Dict>();
//            List<Dict> dicts = dictMapper.selectList(wrapper.eq("pid", id));
//            if (dicts == null || dicts.size() == 0) {
//                return null;
//            } else {
//                return dicts;
//            }
//        }
//    }
//
//    /**
//     * 获取被缓存的对象(用户删除业务)
//     */
//    @Override
//    public String getCacheObject(String para) {
//        return LogObjectHolder.me().get().toString();
//    }
//
    /**
     * 获取子部门id
     */
    @Override
    public List<Long> getSubDeptId(Long deptid) {
        Wrapper<TSystemDeptModel> wrapper = new EntityWrapper<>();
        wrapper.like("pids", "%" + deptid + "%");
        wrapper.ne("state", GlobalConstant.MODEL_DEL);
        List<TSystemDeptModel> depts = systemDeptService.selectList(wrapper);
        List<Long> deptids = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(depts)) {
            for (TSystemDeptModel dept : depts) {
                deptids.add(dept.getId());
            }
        }
        return deptids;
    }
//
//    /**
//     * 获取所有父部门id
//     */
//    @Override
//    public List<Integer> getParentDeptIds(Integer deptid) {
//        Dept dept = deptMapper.selectById(deptid);
//        String pids = dept.getPids();
//        String[] split = pids.split(",");
//        ArrayList<Integer> parentDeptIds = new ArrayList<Integer>();
//        for (String s : split) {
//            parentDeptIds.add(Integer.valueOf(StrKit.removeSuffix(StrKit.removePrefix(s, "["), "]")));
//        }
//        return parentDeptIds;
//    }

    @Override
    public Set<String> findLoginNoPermissionSet() {
        return findMenu(GlobalConstant.MenuControlType.LONGIN);
    }

    @Override
    public Set<String> findLoginAndPermissionSet() {
        return findMenu(GlobalConstant.MenuControlType.LONGIN_AND_PER);
    }

    @Override
    public Set<String> findNoLoginAndPermissionSet() {
        return findMenu(GlobalConstant.MenuControlType.NO_LONGIN);
    }

    private Set<String> findMenu(int type) {
        Wrapper<TSystemMenuModel> wrapper = new EntityWrapper<>();
        wrapper.setSqlSelect("reqUrl");
        wrapper.eq("type", type);
        wrapper.ne("status", GlobalConstant.MODEL_DEL);
        Set<String> loginAndPermissionSet = new HashSet<>();
        List<TSystemMenuModel> list = systemMenuService.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            for (TSystemMenuModel tSystemMenuModel : list) {
                if (StringUtils.isNotEmpty(tSystemMenuModel.getReqUrl())) {
                    loginAndPermissionSet.add(tSystemMenuModel.getReqUrl());
                }
            }
        }
        return loginAndPermissionSet;
    }

}
